home *** CD-ROM | disk | FTP | other *** search
/ MacHack 2000 / MacHack 2000.toast / pc / The Hacks / MacHacksBug / Python 1.5.2c1 / Mac / Tools / IDE / PythonIDEMain.py < prev    next >
Encoding:
Python Source  |  2000-06-23  |  7.8 KB  |  246 lines

  1. # copyright 1997-1998 Just van Rossum, Letterror. just@letterror.com
  2.  
  3. import Splash
  4.  
  5. import FrameWork
  6. import Win
  7. import Wapplication
  8. import W
  9. import os
  10. import macfs
  11.  
  12.  
  13. class PythonIDE(Wapplication.Application):
  14.     
  15.     def __init__(self):
  16.         self.preffilepath = ":Python:PythonIDE preferences"
  17.         Wapplication.Application.__init__(self, 'Pide')
  18.         import AE, AppleEvents
  19.         
  20.         AE.AEInstallEventHandler(AppleEvents.kCoreEventClass, AppleEvents.kAEOpenApplication, 
  21.                 self.ignoreevent)
  22.         AE.AEInstallEventHandler(AppleEvents.kCoreEventClass, AppleEvents.kAEPrintDocuments, 
  23.                 self.ignoreevent)
  24.         AE.AEInstallEventHandler(AppleEvents.kCoreEventClass, AppleEvents.kAEOpenDocuments, 
  25.                 self.opendocsevent)
  26.         AE.AEInstallEventHandler(AppleEvents.kCoreEventClass, AppleEvents.kAEQuitApplication, 
  27.                 self.quitevent)
  28.         import PyConsole, PyEdit
  29.         Splash.wait()
  30.         Splash.uninstall_importhook()
  31.         PyConsole.installoutput()
  32.         PyConsole.installconsole()
  33.         import sys
  34.         for path in sys.argv[1:]:
  35.             self.opendoc(path)
  36.         self.mainloop()
  37.     
  38.     def makeusermenus(self):
  39.         m = Wapplication.Menu(self.menubar, "File")
  40.         newitem = FrameWork.MenuItem(m, "New", "N", 'new')
  41.         openitem = FrameWork.MenuItem(m, "Open…", "O", 'open')
  42.         FrameWork.Separator(m)
  43.         closeitem = FrameWork.MenuItem(m, "Close", "W", 'close')
  44.         saveitem = FrameWork.MenuItem(m, "Save", "S", 'save')
  45.         saveasitem = FrameWork.MenuItem(m, "Save as…", None, 'save_as')
  46.         FrameWork.Separator(m)
  47.         saveasappletitem = FrameWork.MenuItem(m, "Save as Applet…", None, 'save_as_applet')
  48.         FrameWork.Separator(m)
  49.         quititem = FrameWork.MenuItem(m, "Quit", "Q", 'quit')
  50.         
  51.         m = Wapplication.Menu(self.menubar, "Edit")
  52.         undoitem = FrameWork.MenuItem(m, "Undo", 'Z', "undo")
  53.         FrameWork.Separator(m)
  54.         cutitem = FrameWork.MenuItem(m, "Cut", 'X', "cut")
  55.         copyitem = FrameWork.MenuItem(m, "Copy", "C", "copy")
  56.         pasteitem = FrameWork.MenuItem(m, "Paste", "V", "paste")
  57.         FrameWork.MenuItem(m, "Clear", None,  "clear")
  58.         FrameWork.Separator(m)
  59.         selallitem = FrameWork.MenuItem(m, "Select all", "A", "selectall")
  60.         sellineitem = FrameWork.MenuItem(m, "Select line", "L", "selectline")
  61.         FrameWork.Separator(m)
  62.         finditem = FrameWork.MenuItem(m, "Find…", "F", "find")
  63.         findagainitem = FrameWork.MenuItem(m, "Find again", 'G', "findnext")
  64.         enterselitem = FrameWork.MenuItem(m, "Enter search string", "E", "entersearchstring")
  65.         replaceitem = FrameWork.MenuItem(m, "Replace", None, "replace")
  66.         replacefinditem = FrameWork.MenuItem(m, "Replace & find again", 'T', "replacefind")
  67.         FrameWork.Separator(m)
  68.         shiftleftitem = FrameWork.MenuItem(m, "Shift left", "[", "shiftleft")
  69.         shiftrightitem = FrameWork.MenuItem(m, "Shift right", "]", "shiftright")
  70.         
  71.         m = Wapplication.Menu(self.menubar, "Python")
  72.         runitem = FrameWork.MenuItem(m, "Run window", "R", 'run')
  73.         runselitem = FrameWork.MenuItem(m, "Run selection", None, 'runselection')
  74.         FrameWork.Separator(m)
  75.         moditem = FrameWork.MenuItem(m, "Module browser…", "M", self.domenu_modulebrowser)
  76.         FrameWork.Separator(m)
  77.         mm = FrameWork.SubMenu(m, "Preferences")
  78.         FrameWork.MenuItem(mm, "Set Scripts folder…", None, self.do_setscriptsfolder)
  79.         FrameWork.MenuItem(mm, "Editor default settings…", None, self.do_editorprefs)
  80.         FrameWork.MenuItem(mm, "Set default window font…", None, self.do_setwindowfont)
  81.         
  82.         self.openwindowsmenu = Wapplication.Menu(self.menubar, 'Windows')
  83.         self.makeopenwindowsmenu()
  84.         self._menustocheck = [closeitem, saveitem, saveasitem, saveasappletitem,
  85.                 undoitem, cutitem, copyitem, pasteitem, 
  86.                 selallitem, sellineitem, 
  87.                 finditem, findagainitem, enterselitem, replaceitem, replacefinditem,
  88.                 shiftleftitem, shiftrightitem, 
  89.                 runitem, runselitem]
  90.         
  91.         prefs = self.getprefs()
  92.         try:
  93.             fss, fss_changed = macfs.RawAlias(prefs.scriptsfolder).Resolve()
  94.             self.scriptsfolder = fss.NewAlias()
  95.         except:
  96.             path = os.path.join(os.getcwd(), ":Mac:IDE scripts")
  97.             if not os.path.exists(path):
  98.                 path = os.path.join(os.getcwd(), "Scripts")
  99.                 if not os.path.exists(path):
  100.                     os.mkdir(path)
  101.                     f = open(os.path.join(path, "Place your scripts here…"), "w")
  102.                     f.close()
  103.             fss = macfs.FSSpec(path)
  104.             self.scriptsfolder = fss.NewAlias()
  105.             self.scriptsfoldermodtime = fss.GetDates()[1]
  106.         else:
  107.             self.scriptsfoldermodtime = fss.GetDates()[1]
  108.         prefs.scriptsfolder = self.scriptsfolder.data
  109.         self._scripts = {}
  110.         self.scriptsmenu = None
  111.         self.makescriptsmenu()
  112.     
  113.     def quitevent(self, theAppleEvent, theReply):
  114.         import AE
  115.         AE.AEInteractWithUser(50000000)
  116.         self._quit()
  117.     
  118.     def suspendresume(self, onoff):
  119.         if onoff:
  120.             fss, fss_changed = self.scriptsfolder.Resolve()
  121.             modtime = fss.GetDates()[1]
  122.             if self.scriptsfoldermodtime <> modtime or fss_changed:
  123.                 self.scriptsfoldermodtime = modtime
  124.                 W.SetCursor('watch')
  125.                 self.makescriptsmenu()
  126.     
  127.     def ignoreevent(self, theAppleEvent, theReply):
  128.         pass
  129.     
  130.     def opendocsevent(self, theAppleEvent, theReply):
  131.         W.SetCursor('watch')
  132.         import aetools
  133.         parameters, args = aetools.unpackevent(theAppleEvent)
  134.         docs = parameters['----']
  135.         if type(docs) <> type([]):
  136.             docs = [docs]
  137.         for doc in docs:
  138.             fss, a = doc.Resolve()
  139.             path = fss.as_pathname()
  140.             self.opendoc(path)
  141.     
  142.     def opendoc(self, path):
  143.         fcreator, ftype = macfs.FSSpec(path).GetCreatorType()
  144.         if ftype == 'TEXT':
  145.             self.openscript(path)
  146.         else:
  147.             W.Message("Can’t open file of type '%s'." % ftype)
  148.     
  149.     def getabouttext(self):
  150.         return "About Python IDE…"
  151.     
  152.     def do_about(self, id, item, window, event):
  153.         Splash.about()
  154.     
  155.     def do_setscriptsfolder(self, *args):
  156.         fss, ok = macfs.GetDirectory("Select Scripts Folder")
  157.         if ok:
  158.             prefs = self.getprefs()
  159.             alis = fss.NewAlias()
  160.             prefs.scriptsfolder = alis.data
  161.             self.scriptsfolder = alis
  162.             self.makescriptsmenu()
  163.             prefs.save()
  164.     
  165.     def domenu_modulebrowser(self, *args):
  166.         W.SetCursor('watch')
  167.         import ModuleBrowser
  168.         ModuleBrowser.ModuleBrowser()
  169.     
  170.     def domenu_open(self, *args):
  171.         fss, ok = macfs.StandardGetFile("TEXT")
  172.         if ok:
  173.             self.openscript(fss.as_pathname())
  174.     
  175.     def domenu_new(self, *args):
  176.         W.SetCursor('watch')
  177.         import PyEdit
  178.         return PyEdit.Editor()
  179.     
  180.     def makescriptsmenu(self):
  181.         W.SetCursor('watch')
  182.         if self._scripts:
  183.             for id, item in self._scripts.keys():
  184.                 if self.menubar.menus.has_key(id):
  185.                     m = self.menubar.menus[id]
  186.                     m.delete()
  187.             self._scripts = {}
  188.         if self.scriptsmenu:
  189.             if hasattr(self.scriptsmenu, 'id') and self.menubar.menus.has_key(self.scriptsmenu.id):
  190.                 self.scriptsmenu.delete()
  191.         self.scriptsmenu = FrameWork.Menu(self.menubar, "Scripts")
  192.         #FrameWork.MenuItem(self.scriptsmenu, "New script", None, self.domenu_new)
  193.         #self.scriptsmenu.addseparator()
  194.         fss, fss_changed = self.scriptsfolder.Resolve()
  195.         self.scriptswalk(fss.as_pathname(), self.scriptsmenu)
  196.     
  197.     def makeopenwindowsmenu(self):
  198.         for i in range(len(self.openwindowsmenu.items)):
  199.             self.openwindowsmenu.menu.DeleteMenuItem(1)
  200.             self.openwindowsmenu.items = []
  201.         windows = []
  202.         self._openwindows = {}
  203.         for window in self._windows.keys():
  204.             title = window.GetWTitle()
  205.             if not title:
  206.                 title = "<no title>"
  207.             windows.append(title, window)
  208.         windows.sort()
  209.         for title, window in windows:
  210.             if title == "Python Interactive":    # ugly but useful hack by Joe Strout
  211.                 shortcut = '0'
  212.             else: 
  213.                 shortcut = None
  214.             item = FrameWork.MenuItem(self.openwindowsmenu, title, shortcut, callback = self.domenu_openwindows)
  215.             self._openwindows[item.item] = window
  216.         self._openwindowscheckmark = 0
  217.         self.checkopenwindowsmenu()
  218.         
  219.     def domenu_openwindows(self, id, item, window, event):
  220.         w = self._openwindows[item]
  221.         w.ShowWindow()
  222.         w.SelectWindow()
  223.     
  224.     def domenu_quit(self):
  225.         self._quit()
  226.     
  227.     def domenu_save(self, *args):
  228.         print "Save"
  229.     
  230.     def _quit(self):
  231.         import PyConsole, PyEdit
  232.         PyConsole.console.writeprefs()
  233.         PyConsole.output.writeprefs()
  234.         PyEdit.searchengine.writeprefs()
  235.         for window in self._windows.values():
  236.             try:
  237.                 rv = window.close() # ignore any errors while quitting
  238.             except:
  239.                 rv = 0   # (otherwise, we can get stuck!)
  240.             if rv and rv > 0:
  241.                 return
  242.         self.quitting = 1
  243.  
  244. PythonIDE()
  245.  
  246.